Skip to content

嵌入模型是如何训练的?

嵌入模型的训练就像教一个孩子理解单词之间的关系。假设我们想教模型理解"北京"和"中国"的关系应该类似于"东京"和"日本"的关系:

  1. 收集大量例子:首先,我们收集大量文本数据,如网页、书籍、文章等。

  2. 设计学习目标:我们告诉模型,"看到'北京'附近出现的词,很可能也会在'东京'附近出现",例如"首都"、"城市"等词。

  3. 向量空间映射:模型会逐渐学习将每个词映射到一个多维空间中的点(向量)。相关性强的词(如"北京"和"首都")在这个空间中的距离会比较近。

  4. 关系学习:模型不仅学习词与词的距离,还学习词之间的"方向关系"。例如"国王"-"男人"+"女人"="王后",这种向量运算反映了语义关系。

  5. 不断调整:模型根据预测错误不断调整每个词的向量位置,直到能够较好地反映词之间的语义关系。

嵌入模型的数据源与训练特点

嵌入模型通常使用以下数据源进行训练:

  • 互联网文本:如维基百科、新闻网站、博客等
  • 书籍语料库:数字化的书籍文本
  • 社交媒体内容:推文、帖子等(经过筛选)
  • 专业文档:如学术论文、技术文档等

训练过程的特点:

  • 大规模自动化:训练过程几乎完全自动化,不需要人工标注每个词的含义
  • 无监督或自监督学习:模型通过观察词的自然出现模式来学习,使用文本自身作为监督信号
  • 批量处理:一次处理大量文本数据,寻找统计规律
  • 迭代优化:通过多次遍历语料库不断调整词向量

嵌入模型的演进:从简单到复杂

嵌入模型技术不断发展,大致可分为三代:

第一代:静态词嵌入模型

Word2VecGloVe等早期模型生成静态词嵌入,每个词只对应一个固定向量。

训练特点

  • 预测中心词周围的上下文词(CBOW)或用上下文预测中心词(Skip-gram)
  • 每个词无论在什么上下文中,都使用相同的向量表示
  • 无法处理一词多义的情况

简单示例:词嵌入训练

假设我们有这样几个简单句子:

  • "我喜欢吃苹果"
  • "香蕉是水果"
  • "苹果和香蕉都是水果"

训练过程大致如下:

python
# 伪代码示例
import numpy as np

# 1. 为每个词随机初始化向量(实际维度会更高,如300维)
词表 = {"我": np.random.rand(5), "喜欢": np.random.rand(5), "吃": np.random.rand(5), 
     "苹果": np.random.rand(5), "香蕉": np.random.rand(5), "是": np.random.rand(5), 
     "水果": np.random.rand(5), "和": np.random.rand(5), "都": np.random.rand(5)}

# 2. 设置窗口大小,例如上下文窗口为2
窗口大小 = 2

# 3. 对每个句子,提取词对:中心词和上下文词
# 例如对"我喜欢吃苹果",如果中心词是"喜欢",上下文词有"我"和"吃"

# 4. 训练目标:预测给定中心词时,上下文词出现的概率
# 使用类似这样的损失函数:
def 训练(中心词, 上下文词):
    中心词向量 = 词表[中心词]
    上下文向量 = 词表[上下文词]
    相似度 = np.dot(中心词向量, 上下文向量)  # 点积
    # 根据相似度计算预测概率
    # 计算损失并更新向量
    # ...

# 5. 多次迭代训练后,"苹果"和"香蕉"的向量会变得相似
# 因为它们经常出现在相似的上下文中(如"水果"附近)

训练完成后,"苹果"和"香蕉"的向量会比较接近,而"苹果"和"喜欢"的向量则相距较远。这样,通过计算向量之间的距离或相似度,我们就能找到语义上相关的词语。

第二代:上下文相关的嵌入模型

BERT等模型能根据上下文生成动态词嵌入,解决一词多义问题。

BERT模型:上下文感知的嵌入生成器

BERT是一种能根据上下文生成动态词嵌入的模型,它通过两个预训练任务学习语言特征:

1. 掩码语言模型(Masked LM)

BERT通过类似完形填空的方式学习预测被遮挡的词:

训练过程:

  1. 准备句子:比如"我喜欢在公园散步"
  2. 随机遮住约15%的词:变成"我喜欢在[MASK]散步"
  3. 让模型预测:BERT尝试根据上下文预测被遮挡的词是"公园"
  4. 参数更新:根据预测结果调整模型参数

实际例子

原句:今天天气真好,我们去野餐吧
处理后:今天天气真[MASK],我们去野餐吧
BERT任务:预测[MASK]处应该是"好"

这样,BERT学会了根据上下文理解词的含义,能处理一词多义的情况。

2. 下一句预测(Next Sentence Prediction)

BERT同时学习判断两个句子是否有逻辑关联:

训练过程:

  1. 准备句子对

    句子A:小明在看书
    句子B:他很喜欢阅读
  2. 添加特殊标记:在句子开头加[CLS],两句之间加[SEP]

    [CLS] 小明在看书 [SEP] 他很喜欢阅读 [SEP]
  3. 二分类任务:模型学习判断句子B是否是句子A的逻辑续句

    • 训练数据中50%是真正相关的句子对,标记为"IsNext"
    • 另50%是随机配对的无关句子对,标记为"NotNext"
  4. 使用[CLS]标记:[CLS]对应的最终表示用于这个二分类任务

实际例子

正确配对:
[CLS] 我买了一双新鞋 [SEP] 它们很合脚 [SEP]  → 判断:IsNext

错误配对:
[CLS] 我买了一双新鞋 [SEP] 今天的晚饭是米饭 [SEP]  → 判断:NotNext

第三代:更大更强的嵌入模型

BERT之后,出现了一系列改进模型,各有特点:

  • RoBERTa:移除了下一句预测任务,使用更大批量和更多数据,性能优于BERT
  • GPT系列:使用单向(从左到右)注意力机制,擅长生成任务
  • T5:将所有NLP任务统一为文本到文本的转换问题
  • DeBERTa:使用解耦注意力机制和改进的掩码解码器,在多项任务上超越BERT

中国主流嵌入模型:BGE和GTE的训练方法

中国也开发了优秀的嵌入模型,其中最具代表性的是BGE和GTE。

BGE (BAAI General Embedding)

BGE由北京人工智能研究院(BAAI)开发,是目前在多个嵌入模型基准上表现最好的模型之一。

训练方法

  1. 预训练阶段:使用RetroMAE(一种自编码器变体)在大规模语料上进行预训练
  2. 微调阶段:在大规模文本对数据上使用对比学习进行微调
  3. 指令增强:在查询前添加特定指令(如"为这个句子生成表示以用于检索相关文章:")来提升检索性能

BGE特点

  • 支持中英双语,提供large、base、small不同规模版本
  • v1.5版本改进了相似度分布问题,提升了无指令条件下的检索能力
  • 发布了专门的重排模型(Reranker)用于对检索结果进行重新排序
  • 在MTEB和C-MTEB基准上取得了领先成绩

GTE (General Text Embeddings)

GTE由阿里达摩院开发,使用多阶段对比学习方法训练。

训练方法

  1. 多阶段对比学习
    • 第一阶段:无监督的对比式预训练
    • 第二阶段:在多种任务混合数据集上进行监督式对比学习微调
  2. 数据多样性:使用大规模相关文本对进行训练,覆盖广泛的领域和场景
  3. 模型架构:基于BERT框架,提供large、base、small三种规模

GTE特点

  • 支持信息检索、语义文本相似度、文本重排等多种任务
  • 最新的GTE-v1.5系列模型支持最长8192个token的上下文长度
  • 在同规模模型中在MTEB基准上表现优异
  • 使用transformer++架构(BERT+RoPE+GLU)

嵌入模型的技术价值

现代嵌入模型能有效理解语言的原因:

  1. 上下文敏感:同一个词在不同上下文中有不同的表示
  2. 预训练+微调:先从海量通用文本学习,再针对特定任务调整
  3. 层次化表示:从词法到句法再到语义的多层次特征学习
  4. 自监督学习:利用文本自身作为监督信号,无需人工标注

这些特性使得嵌入模型能够捕捉语言的细微差别和复杂结构,为各种自然语言处理任务提供强大基础。